home *** CD-ROM | disk | FTP | other *** search
/ Clickx 65 / Clickx 65.iso / software / internet / xmarks / xmarks-3.1.1.xpi / chrome / content / foxmarks-discover.js < prev    next >
Encoding:
JavaScript  |  2009-05-05  |  26.8 KB  |  746 lines

  1. /* 
  2.  Copyright 2009 Foxmarks Inc.
  3.  
  4.  foxmarks-discover.js: Classes related to SERP and sim sites
  5.  
  6.  */
  7.  
  8. var Cc = Components.classes;
  9. var Ci = Components.interfaces;
  10.  
  11. var FoxmarksSimSites = {
  12.     DRIFTSITE: "/site/?cid=xmfx&url=",
  13.     SIMSITE: "/internal/visitsite?cid=xmfx&id=",
  14.     TOPICSITE: "/topic/",
  15.     WRITEREVIEW: "/review/edit/?cid=xmfx&url=",
  16.     _iconLoaded: false,
  17.     observe: function(subject, topic, data) {
  18.         if(data == "extensions.xmarks.enableSimSite"){
  19.             if(this.settings.simsiteEnabled && !this._iconLoaded){
  20.                 this.addIcon();
  21.             } else {
  22.                 var image = document.getElementById("foxmarks-ss-button");
  23.                 image.parentNode.removeChild(image);
  24.                 this._iconLoaded = false;
  25.             }
  26.         }
  27.     },
  28.     addIcon: function(){
  29.         var staricon = document.getElementById("star-button");
  30.         if(staricon && !this._iconLoaded){
  31.             var img = document.createElement('image');
  32.             img.setAttribute('id', "foxmarks-ss-button");
  33.             img.setAttribute('tooltiptext',
  34.                     Bundle().GetStringFromName("similarsite.getsiteinfo"));
  35.             img.setAttribute('src', 
  36.                     gSettings.httpProtocol + gSettings.staticHost +
  37.                     gSettings.bibBug);
  38.             img.addEventListener(
  39.                 "mousedown",
  40.                 function(e){
  41.                     FoxmarksSimSites.showSimSites();
  42.                 },
  43.                 true
  44.             );
  45.  
  46.             staricon.parentNode.appendChild(img);
  47.             this._iconLoaded = true;
  48.         }
  49.     },
  50.     init: function(){
  51.         this.settings = gSettings;
  52.         if(gSettings.simsiteEnabled){
  53.             this.addIcon();
  54.         }
  55.         var prefs = Components.classes["@mozilla.org/preferences-service;1"]
  56.                 .getService(Components.interfaces.nsIPrefBranch2);
  57.         prefs.addObserver("extensions.xmarks.", this, false);
  58.     },
  59.     clearPanel: function(){
  60.         document.getElementById("foxmarks-ss-progtitle").
  61.             setAttribute("hidden", "true");
  62.         document.getElementById("foxmarks-ss-progress").
  63.             setAttribute("hidden", "false");
  64.         document.getElementById("foxmarks-ss-body").
  65.             setAttribute("hidden", "true");
  66.     },
  67.     onPopupHiding: function(){
  68.         if(this._inflight){
  69.             this._inflight = false;
  70.             SimilarSitesCancel();
  71.         }
  72.         FoxmarksSimSites.detachKeyListener();
  73.         return true;
  74.     },
  75.     _handleKeyListener: function(e){
  76.         // static member; this is undefined
  77.         if(e.metaKey){
  78.            return;
  79.         }
  80.         var panel = document.getElementById("foxmarks-similarsites");
  81.         if(panel){
  82.             panel.hidePopup();
  83.         }
  84.     },
  85.     detachKeyListener: function(){
  86.         var urlbar = document.getElementById("urlbar");
  87.         if(!urlbar){
  88.             return;
  89.         }
  90.         urlbar.removeEventListener("keydown", this._handleKeyListener, true);
  91.     },
  92.     attachKeyListener: function(){
  93.         var urlbar = document.getElementById("urlbar");
  94.         if(!urlbar){
  95.             return;
  96.         }
  97.         urlbar.addEventListener("keydown", this._handleKeyListener, true);
  98.     },
  99.     showSimSites: function(){
  100.         var panel = document.getElementById("foxmarks-similarsites");
  101.         if(panel){
  102.             this.attachKeyListener();
  103.             panel.openPopup(
  104.                 document.getElementById("urlbar"),
  105.                 "after_end",
  106.                 0,
  107.                 0,
  108.                 false,
  109.                 false
  110.             );
  111.             var url = gBrowser.selectedBrowser.contentDocument.location.href;
  112.             // remove cache from this version; doesn't work so well
  113.            // if(url == this._cachedURL){
  114.            //     this.loadData(this._cachedData);
  115.             //} else {
  116.                 this._cachedURL = url;
  117.                 this.clearPanel();
  118.                 this._inflight = true;
  119.  
  120.                 var self = this;
  121.                 FetchSimilarSites(
  122.                     url, 
  123.                     document.getElementById("foxmarks-ss-progtitle"), 
  124.                     document.getElementById("foxmarks-ss-throbber"), 
  125.                     function(data){
  126.                         self._inflight = false;
  127.                         FoxmarksSimSites.loadData(data);
  128.                     }
  129.                 );
  130.             //}
  131.         }
  132.     },
  133.     _cachedURL: "",
  134.     _cachedData: null,
  135.     _setRating: function(info, is_rating){
  136.         var imgname = "rating-0-stars.gif";
  137.         var txt = "";
  138.         var style = "";
  139.         var rating = info ? Math.floor(info.rating * 2) : 0;
  140.         if(info){
  141.            imgname = "rating-" + rating + "-stars.gif";
  142.            switch(info.numreviews){
  143.                case 0:
  144.                    txt = Bundle().GetStringFromName("similarsite.noreviews");
  145.                    break;
  146.                case 1:
  147.                    txt = Bundle().GetStringFromName("similarsite.onereview");
  148.                    style = "text-decoration: underline; color: #336699;";
  149.                    break;
  150.                default:
  151.                    txt = Bundle().formatStringFromName(
  152.                         "similarsite.numreviews",
  153.                         [info.numreviews.toString()],
  154.                         1
  155.                    );
  156.                    style = "text-decoration: underline; color: #336699;";
  157.                 break;
  158.             }
  159.         } else {
  160.             txt = Bundle().GetStringFromName("similarsite.noreviews");
  161.         }
  162.  
  163.         document.getElementById("foxmarks-ss-ratingimg").
  164.             src  = "chrome://foxmarks/skin/images/" + imgname;
  165.         document.getElementById("foxmarks-ss-rating").
  166.             setAttribute("value",txt); 
  167.         document.getElementById("foxmarks-ss-rating").
  168.             setAttribute("style",style); 
  169.     },
  170.     _setPopularity: function(info, is_rating){
  171.         var imgname = "popularity-0-stars.gif";
  172.         if(info){
  173.             var rating = Math.floor(info.popularity / 10);
  174.             imgname = "popularity-" + rating + "-stars.gif";
  175.         }
  176.  
  177.         document.getElementById("foxmarks-ss-popularimg").
  178.             setAttribute("src", 
  179.                 "chrome://foxmarks/skin/images/" + imgname);
  180.     },
  181.     _cleanURL: function(url){
  182.         var i = url.indexOf(":");
  183.         if(i > 0){
  184.             return url.substring(i+3);
  185.         }
  186.         return url;
  187.     },
  188.     _appendRelated: function(relatedBox, item, index){
  189.         var container = document.createElement('hbox');
  190.  
  191.         var extstyle = (relatedBox.childNodes.length == 0)?
  192.             "border-top: 1px solid #ccc;" : "";
  193.         container.setAttribute('style',
  194.             "padding: 8px 0px; border-bottom: 1px solid #ccc;" + extstyle);
  195.         container.setAttribute('id',
  196.                 "foxmarks-ss-relatedsite." + item.url_id);
  197.         container.setAttribute("crop", "end");
  198.         container.setAttribute("flex", "1");
  199.  
  200.  
  201.         var thumbvbox = document.createElement('vbox');
  202.         var thumb = document.createElement('image');
  203.         thumb.setAttribute("src",
  204.              gSettings.httpProtocol + gSettings.apiHost +
  205.              '/discover/thumbnail/read?cid=xmfx&size=Small&id=' +
  206.              item.url_id
  207.         );
  208.         thumb.setAttribute("style","padding-left: 8px;");
  209.         thumb.setAttribute("width","111");
  210.         thumb.setAttribute("height","82");
  211.         thumbvbox.appendChild(thumb);
  212.         var spacer = document.createElement('spacer');
  213.         spacer.setAttribute('flex', '1');
  214.         thumbvbox.appendChild(spacer);
  215.  
  216.         container.appendChild(thumbvbox);
  217.  
  218.         var vbox = document.createElement('vbox');
  219.         var title = document.createElement('label');
  220.         title.setAttribute('value', this._trim(item.title));
  221.         title.setAttribute('style',
  222.             "font-size: 14px; text-decoration: underline; color: #034E89;");
  223.         title.setAttribute("crop", "end");
  224.         title.setAttribute("flex", "1");
  225.         vbox.setAttribute("flex", "1");
  226.         vbox.appendChild(title);
  227.  
  228.         var desc = document.createElement('description');
  229.         desc.setAttribute("maxwidth", "500");
  230.         desc.setAttribute("flex", "1");
  231.         desc.setAttribute("style", "padding-left: 8px;");
  232.         desc.appendChild(document.createTextNode(item.description));
  233.         vbox.appendChild(desc);
  234.  
  235.         var hbox = document.createElement('hbox');
  236.         var url = document.createElement('label');
  237.         url.setAttribute('value', this._cleanURL(item.url));
  238.         url.setAttribute('style', "color: #7D8F34;padding-right: 0px; margin-right: 0px;");
  239.         url.setAttribute('crop', "end");
  240.         url.setAttribute('flex', "1");
  241.         hbox.setAttribute('crop', "end");
  242.         hbox.setAttribute('flex', "1");
  243.         hbox.appendChild(url);
  244.         var dash = document.createElement('label');
  245.         dash.setAttribute('value', '-');
  246.         dash.setAttribute('style', 'padding: 2px; margin: 0;');
  247.         hbox.appendChild(dash);
  248.         var getinfo = document.createElement('label');
  249.         getinfo.setAttribute('value',
  250.             Bundle().GetStringFromName("similarsite.getsiteinfocaps"));
  251.         getinfo.setAttribute('style',
  252.             "font-size: 10px; font-family:arial,sans-serif; text-decoration: none; color: #0086C3; cursor: pointer; text-tranform: uppercase; margin: 0; padding: 2px 4px 2px 22px; background: transparent url('chrome://foxmarks/skin/images/get-info-18x18.png') no-repeat;");
  253.         getinfo.setAttribute('id',
  254.             "foxmarks-ss-getsiteinfo." + item.url_id);
  255.         hbox.appendChild(getinfo);
  256.         spacer = document.createElement('spacing');
  257.         spacer.setAttribute("flex", "5000");
  258.         hbox.appendChild(spacer);
  259.         spacer = document.createElement('spacing');
  260.         spacer.setAttribute("flex", "1");
  261.         vbox.appendChild(hbox);
  262.         container.appendChild(vbox);
  263.         container.appendChild(spacer);
  264.         var buttonContainer = document.createElement('vbox');
  265.         var spacer2 = document.createElement('spacing');
  266.         spacer2.setAttribute("flex", "1");
  267.         //buttonContainer.appendChild(getinfo);
  268.         buttonContainer.appendChild(spacer2);
  269.         container.appendChild(buttonContainer);
  270.         relatedBox.appendChild(container);
  271.        
  272.         var self =this;
  273.         container.addEventListener('mouseover',
  274.                 function(e){
  275.                     container.style.background = "#4F8EC9";
  276.                     title.style.color = "white";
  277.                     desc.style.color = "white";
  278.                     dash.style.color = "white";
  279.                     getinfo.style.color = "white";
  280.                     url.style.color = "white";
  281.                 }, false);
  282.         container.addEventListener('mouseout',
  283.                 function(e){
  284.                     container.style.background = "transparent";
  285.                     title.style.color = "#034E89";
  286.                     desc.style.color = "black";
  287.                     dash.style.color = "black";
  288.                     getinfo.style.color = "#0086C3";
  289.                     url.style.color = "#7D8F34";
  290.                 }, false);
  291.         container.addEventListener('click',
  292.                 function(e){
  293.                     var panel = document.getElementById("foxmarks-similarsites");
  294.                     panel.hidePopup();
  295.                     var url =
  296.                         gSettings.httpProtocol + gSettings.apiHost +
  297.                         self.SIMSITE + item.url_id + "&mid=" +
  298.                         gSettings.machineId + "&i=" + index;
  299.                     if(e.metaKey){
  300.                         gBrowser.selectedTab = gBrowser.addTab(url);
  301.                     } else {
  302.                         gBrowser.selectedBrowser.contentDocument.location.href =
  303.                             url;
  304.                     }
  305.                 }, false);
  306.         getinfo.addEventListener('click',
  307.                 function(e){
  308.                     var panel = document.getElementById("foxmarks-similarsites");
  309.                     panel.hidePopup();
  310.                     e.stopPropagation();
  311.                     gBrowser.selectedBrowser.contentDocument.location.href =
  312.                         gSettings.httpProtocol + gSettings.driftHost +
  313.                         self.DRIFTSITE + encodeURIComponent(item.url);
  314.                 }, false);
  315.     },
  316.     _addListeners: function(meta, rating){
  317.         var newreview = document.getElementById("foxmarks-ss-writereview");
  318.         var reviews = document.getElementById("foxmarks-ss-rating");
  319.         var panel = document.getElementById("foxmarks-similarsites");
  320.         var moreinfo = document.getElementById("foxmarks-ss-getsiteinfo");
  321.         reviews.addEventListener(
  322.             "click",
  323.             function(e){
  324.                 if(rating && rating.numreviews){
  325.                     panel.hidePopup();
  326.                     e.stopPropagation();
  327.                     gBrowser.selectedBrowser.contentDocument.location.href =
  328.                         gSettings.httpProtocol + gSettings.driftHost + 
  329.                         self.DRIFTSITE + encodeURIComponent(meta.url) + "#r";
  330.                 }
  331.             },
  332.             false
  333.         );
  334.         newreview.addEventListener(
  335.             "click",
  336.             function(e){
  337.                 panel.hidePopup();
  338.                 e.stopPropagation();
  339.                 gBrowser.selectedBrowser.contentDocument.location.href =
  340.                     gSettings.httpProtocol + gSettings.driftHost + 
  341.                     self.WRITEREVIEW +
  342.                     encodeURIComponent(meta.url);
  343.             },
  344.             false
  345.         );
  346.         var self = this;
  347.         moreinfo.addEventListener(
  348.             "click",
  349.             function(e){
  350.                 panel.hidePopup();
  351.                 e.stopPropagation();
  352.                 gBrowser.selectedBrowser.contentDocument.location.href =
  353.                     gSettings.httpProtocol + gSettings.driftHost +
  354.                     self.DRIFTSITE +
  355.                     encodeURIComponent(meta.url);
  356.             },
  357.             false
  358.         );
  359.     },
  360.     _setTopics: function(topics){
  361.         var container = document.getElementById("foxmarks-ss.topics");
  362.         var len = container.childNodes.length;
  363.         while(len--){
  364.             container.removeChild(container.childNodes[len]);
  365.         }
  366.         var label = document.createElement("label");
  367.         label.setAttribute("value",
  368.             Bundle().GetStringFromName("similarsite.topics")
  369.         );
  370.         label.setAttribute("style",
  371.             "color: #666; font-size: 12px; font-weight: bold; letter-spacing: 1px; width: 82px; padding: 0; margin: 0;");
  372.         container.appendChild(label);
  373.         
  374.         if(!topics || !topics.length){
  375.             var label = document.createElement("label");
  376.             label.setAttribute("value",
  377.                 Bundle().GetStringFromName("similarsite.notopics")
  378.             );
  379.             label.setAttribute("style", "padding: 0; margin: 0;font-size: 11px; text-decoration: none; color: black;");
  380.             container.appendChild(label);
  381.             return;
  382.         }
  383.         var len = topics.length;
  384.         if(len > 5) len = 5;
  385.  
  386.  
  387.         for(var x = 0; x < len; x++){
  388.             var label = document.createElement("label");
  389.             label.setAttribute("value", topics[x][0]);
  390.             label.setAttribute("crop", "end");
  391.             label.setAttribute("style", "padding: 0; margin: 0;font-size: 11px; text-decoration: none; color: #034E89;");
  392.             this._setTopicListener(label, topics[x][0]);
  393.             container.appendChild(label);
  394.             if(x + 1 < len){
  395.                 var label = document.createElement("label");
  396.                 label.setAttribute("value",", " );
  397.                 label.setAttribute("crop", "end");
  398.                 label.setAttribute("style", "padding: 0; margin: 0;font-size: 11px; color: black;");
  399.                 container.appendChild(label);
  400.             }
  401.         }
  402.     },
  403.     _setTopicListener: function(label, topic){
  404.        var self = this;
  405.        label.addEventListener("click",
  406.             function(e){
  407.                 var panel = document.getElementById("foxmarks-similarsites");
  408.                 panel.hidePopup();
  409.                 e.stopPropagation();
  410.                 gBrowser.selectedBrowser.contentDocument.location.href =
  411.                         gSettings.httpProtocol + gSettings.driftHost +
  412.                         self.TOPICSITE + topic;
  413.             },
  414.             false
  415.        );
  416.        label.addEventListener("mouseover",
  417.             function(e){
  418.                 label.setAttribute("style", 
  419.                     "padding: 0; margin: 0;font-size: 11px; text-decoration: underline; color: #034E89;");
  420.             },
  421.             false
  422.        );
  423.        label.addEventListener("mouseout",
  424.             function(e){
  425.                 label.setAttribute("style", 
  426.                     "padding: 0; margin: 0;font-size: 11px; text-decoration: none; color: #034E89;");
  427.             },
  428.             false
  429.        );
  430.     },
  431.     _trim: function(str){
  432.         if(!str)
  433.             return "";
  434.         return str.replace(/^\s*|\s*$/g,'');
  435.     },
  436.     loadData: function(data){
  437.  
  438.         if(data && data.status == 0){
  439.      //     this._cachedData = data;
  440.  
  441.             var meta = data.related.urls[this._cachedURL];
  442.             if(meta){ 
  443.                 var id = meta.url_id;
  444.                 var related = [x  for each (x in  meta["related_urls"]) if 
  445.                     (!x.attrs || !x.attrs.foreign) ];
  446.                 var rating = data.rating ? data.rating[id] : null;
  447.                 var topics = data.topics ? data.topics.ids[id].topics : null;
  448.                 try {
  449.                     var title = meta.title.length ? meta.title : meta.url;
  450.                     document.getElementById("foxmarks-ss-title").
  451.                         setAttribute("value", this._trim(title));
  452.                     var desc = document.getElementById("foxmarks-ss-desc");
  453.                     while(desc.childNodes.length > 0){
  454.                         desc.removeChild(desc.childNodes[0]);
  455.                     }
  456.                     var descText = document.createTextNode(meta.description);
  457.                     desc.appendChild(descText);
  458.                     this._setRating(rating);
  459.                     this._setPopularity(meta);
  460.  
  461.                     // add topics
  462.                     this._setTopics(topics);
  463.  
  464.                     // add related
  465.                     var relatedBox = document.getElementById("foxmarks-ss-related");
  466.                     var len = relatedBox.childNodes.length;
  467.                     while(len--){
  468.                         relatedBox.removeChild(relatedBox.childNodes[len]);
  469.                     }
  470.  
  471.                     var len = related.length;
  472.                     if(len > 5)
  473.                         len = 5;
  474.                     for(var x = 0; x < len; x++){
  475.                         this._appendRelated(relatedBox, related[x], x + 1);
  476.                     }
  477.                     if(len == 0){
  478.                         var label = document.createElement("label");
  479.                         label.setAttribute("crop", "end");
  480.                         label.setAttribute("value",
  481.                             Bundle().GetStringFromName(
  482.                                 "similarsite.nosimsites")
  483.                         );
  484.                         label.setAttribute("style",
  485.                             "padding: 8px; padding-left: 0px;font-size: 14px; font-weight: bold;"
  486.                         );
  487.                         relatedBox.appendChild(label);
  488.                     }
  489.  
  490.                     this._addListeners(meta, rating);
  491.                 } catch(e){
  492.                     Components.utils.reportError(e);
  493.                 }
  494.  
  495.                 document.getElementById("foxmarks-ss-progress").
  496.                     setAttribute("hidden", "true");
  497.                 document.getElementById("foxmarks-ss-body").
  498.                     setAttribute("hidden", "false");
  499.             }
  500.         } else {
  501.             var errbox = document.getElementById("foxmarks-ss-progtitle");
  502.  
  503.             errbox.setAttribute("value",
  504.                 Bundle().GetStringFromName(
  505.                     data.status == 0 || data.status == 400 ?
  506.                     "similarsite.nositeinfo" :
  507.                     "similarsite.busy"
  508.                 )
  509.             );
  510.  
  511.             errbox.setAttribute("hidden", "false");
  512.         }
  513.     }
  514.  
  515. };
  516. var FoxmarksSERP = {
  517.     DEBUGSCRIPTURL: "/SERP/gink.js",
  518.     SCRIPTURL: "/SERP/",
  519.     init: function(){
  520.         var domain = Bundle().GetStringFromName("serp.googleintl");
  521.         this.INTL_PATTERN =
  522.             new RegExp("http:\/\/" + domain + "\/.*[?&]q=([^&]+)");
  523.         var appcontent = document.getElementById("appcontent");
  524.         if(appcontent){
  525.             appcontent.addEventListener(
  526.                 "DOMContentLoaded", 
  527.                 function(e){ 
  528.                     if(e.originalTarget.nodeName == "#document"){
  529.                         FoxmarksSERP.onPageLoad(e);
  530.                     }
  531.                 },
  532.                 true
  533.             );
  534.         }
  535.     },
  536.     buildScriptURL: function(){
  537.         var lang = gSettings.lang;
  538.         if(gSettings.getDebugOption("serp")){
  539.             return this.DEBUGSCRIPTURL;
  540.         }
  541.  
  542.         if(!lang){
  543.             return this.SCRIPTURL + gSettings.serpPrefix + ".js";
  544.         }
  545.         var langshort = lang.split('-')[0];
  546.         
  547.         if(langshort == "en"){
  548.             return this.SCRIPTURL + gSettings.serpPrefix + ".js";
  549.         }
  550.         var langs = {
  551.             bn: 1, cs: 1, da: 1, de: 1, el: 1, eu: 1, es: 1, fi: 1, fr: 1,
  552.             fy: 1, hu: 1, bg: 1, it: 1, ja: 1, ko: 1, nb: 1, nl: 1, pl: 1,
  553.             ro: 1, ru: 1, sk: 1, sv: 1, tr: 1, uk: 1, vi: 1
  554.         };
  555.  
  556.         if(langshort in langs){
  557.             return "/SERP/" + gSettings.serpPrefix + "." + langshort + ".js";
  558.         }
  559.  
  560.         switch(lang){
  561.             case "pt-BR":
  562.             case "pt-PT":
  563.             case "zh-CN":
  564.             case "zh-TW":
  565.                 return "/SERP/" + gSettings.serpPrefix + "." + lang + ".js";
  566.         }
  567.  
  568.         return this.SCRIPTURL + gSettings.serpPrefix + ".js";
  569.     },
  570.     onPageLoad: function(e){
  571.         var doc = e.originalTarget;
  572.         this.doc = doc;
  573.         var rx = new RegExp(gSettings.serpRegex);
  574.         if(gSettings.serpEnabled && doc && 
  575.            doc.location && 
  576.            doc.location.href && 
  577.            rx.test(doc.location.href)
  578.         ){
  579.             doc = doc.defaultView.top.document;
  580.             this.doc = doc;
  581.             var bodytags = doc.getElementsByTagName('body');
  582.             if(bodytags && bodytags.length == 1){
  583.                 var field = doc.createElement('input');
  584.                 field.setAttribute('type', 'hidden');
  585.                 field.setAttribute('id', 'foxmarks.prefs');
  586.                 var prefs = [];
  587.                 prefs.push("MACHINEID=" + gSettings.machineId);
  588.                 prefs.push("NUM_TO_SHOW=" + gSettings.serpMaxItems);
  589.                 prefs.push("APIHOST=" + gSettings.apiHost);
  590.                 prefs.push("DRIFTHOST=" + gSettings.driftHost);
  591.                 prefs.push("STATICHOST=" + gSettings.staticHost);
  592.                 if(gSettings.getDebugOption("serp")){
  593.                     prefs.push("DEBUG=" + gSettings.getDebugOption("serp"));
  594.                 }
  595.                 field.setAttribute('value', prefs.join(";"));
  596.                 bodytags[0].appendChild(field);
  597.  
  598.             }
  599.             var headtags = doc.getElementsByTagName('head');
  600.             if(headtags && headtags.length == 1){
  601.                 var script = doc.createElement('script');
  602.                 script.setAttribute('src', "http://"+ gSettings.staticHost + 
  603.                     this.buildScriptURL()
  604.                 );
  605.                 headtags[0].appendChild(script);
  606.  
  607.                 this.insertST(doc);
  608.             }
  609.         }
  610.     },
  611.     insertST: function(doc){
  612.         var a = doc.getElementsByTagName("a");
  613.         var len = a.length;
  614.         var i;
  615.         var self = this;
  616.  
  617.         this._stData = [];
  618.         if(len == 0){
  619.             return ;
  620.         }
  621.         var found = 10;
  622.         for(var i =0; i < len; i++){
  623.             var item = a[i];
  624.             if(item.className == "l" &&
  625.                 item.parentNode && item.parentNode.className == "r" &&
  626.                 item.parentNode.nextSibling && 
  627.                 (item.parentNode.nextSibling.className== "s" ||
  628.                 item.parentNode.nextSibling.tagName == 'SPAN')){
  629.                 if(found > 0){
  630.                     item.addEventListener("click", 
  631.                         function(e){
  632.                             self.handleClickST(e,doc);
  633.                         },
  634.                         true
  635.                     );
  636.                         
  637.                     this._stData.push(item);
  638.                     found--;
  639.                 } else {
  640.                     break;
  641.                 }
  642.             }
  643.         }
  644.         doc.defaultView.addEventListener("unload",
  645.             function(e){
  646.                 self.handleUnloadST(e, doc);
  647.             },
  648.             true
  649.         );
  650.  
  651.         doc.addEventListener("DOMNodeInserted",
  652.             function(e){
  653.                 if(e.target && e.target.id == "foxmarks.arrow"){
  654.                     self.handleHoverST(e, doc);
  655.  
  656.                 }
  657.             },
  658.             false
  659.         );
  660.     },
  661.     _isDec: function(obj){
  662.         var gp = obj.parentNode.parentNode;
  663.         var a = gp.getElementsByTagName('a');
  664.         var len = a.length;
  665.         var token = "foxmarks";
  666.  
  667.         for(var x = 0;  x < len ; x++){
  668.             if(a[x].id && a[x].id.substr(0, token.length) == token){
  669.                 return true;
  670.             }
  671.         }
  672.  
  673.         return false;
  674.     },
  675.     _hasDec: function(){
  676.         var a = this._stData;
  677.         var len = a.length;
  678.         var x;
  679.         for(x = 0; x < len; x++){
  680.            if(this._isDec(a[x])){
  681.                return true;
  682.            }
  683.         }
  684.  
  685.         return false;
  686.     },
  687.     handleClickST: function(e, doc){
  688.         var a = this._stData;
  689.         var target = e.target;
  690.         var len = a.length;
  691.         var x;
  692.         for(x = 0; x < len; x++){
  693.            if(a[x] === target){
  694.                break;
  695.            }
  696.         }
  697.         if(x < len){
  698.             gSettings.incrST(x, this._isDec(target) ? "dc" : "uc",
  699.                     this._hasDec());
  700.         }
  701.  
  702.         
  703.     },
  704.     handleHoverST: function(e, doc){
  705.         var target = e.target.parentNode.parentNode;
  706.         var a = target.getElementsByTagName('a');
  707.         var len = a.length;
  708.         var item = null;
  709.         var x;
  710.         for(x = 0; x < len; x++){
  711.            if(a[x].className == 'l'){
  712.                item = a[x];
  713.            }
  714.         }
  715.         if(item){
  716.             a = this._stData;
  717.             len = a.length;
  718.             for(x = 0; x < len; x++){
  719.                 if(a[x] === item){
  720.                     gSettings.incrST(x, "h", true);
  721.                     return;
  722.                 }
  723.             }
  724.         }
  725.     },
  726.     handleUnloadST: function(e, doc){
  727.         var a = this._stData;
  728.         var len = a.length;
  729.         var x;
  730.         var hasDec = this._hasDec();
  731.         for(x = 0; x < len; x++){
  732.             gSettings.incrST(x, this._isDec(a[x]) ? "d" : "u", hasDec);
  733.         }
  734.         for(; x < 10; x++){
  735.             gSettings.incrST(x, "na", hasDec);
  736.         }
  737.         
  738.         if(this.doc){
  739.             var i = this.doc.getElementById("foxmarks.prefsout");
  740.             if(i && i.value){
  741.                 gSettings.trSERP = gSettings.trSERP + i.value;
  742.             }
  743.         }
  744.     }
  745. };
  746.